﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "IGraphicsNode.h"

namespace Json
{
    class Value;
}

namespace gcmp
{
    class IBody;
    class IGraphicsNodeList;
    class IGraphicsBRepFace;
    class IGraphicsBRepEdge;
    class GcmpJsonWrapper;

    /// \brief BRep体图形节点
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsBRepBody : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(IGraphicsBRepBody, IGraphicsNode)  
   
    public:
        /// \brief 析构器
        virtual ~IGraphicsBRepBody();

    public:

        /// \brief 获取体里所有的面
        /// \return 体里所有的面
        virtual std::vector<const IGraphicsBRepFace*> GetFaces() const = 0;

        /// \brief 获取体里所有的边
        /// \return 体里所有的边
        virtual std::vector<const IGraphicsBRepEdge*> GetEdges() const = 0;

        /// \brief 获取几何体
        /// \return 几何体
        virtual const IBody* GetGeometry() const = 0;

        /// \brief 设置几何体
        /// \param opBody 几何体
        /// \return true-设置成功；false-设置失败
        virtual bool SetGeometry(OwnerPtr<IBody> opBody) = 0;

        /// \brief 获取几何体
        /// \return 几何体
        virtual IBody* GetGeometryFW() = 0;

        /// \brief 获取体里所有的面数
        /// \return 体里所有的面数
        virtual int GetFaceCount() const = 0;

        /// \brief 获取体里所有的边数
        /// \return 体里所有的边数
        virtual int GetEdgeCount()const = 0;

        /// \brief 合并另一个体
        /// \param pOtherBody 被合并的体
        /// \return 无    
        virtual void MergeBody(const IGraphicsBRepBody* pOtherBody) = 0;

        /// \brief 合并多个体
        /// \param opBodies 被合并的多个体
        /// \return 无    
        virtual void MergeBodies(const std::vector<OwnerPtr<IGraphicsBRepBody>>& opBodies) = 0;

        /// \brief 合并重合面
        /// \return true-有合并；false-没有合并
        virtual bool MergeCoincideFace() = 0;

        /// \brief 根据索引获取体的面
        /// \param index 索引
        /// \return 体的面
        virtual const IGraphicsBRepFace* GetFace(int index) const = 0;

        /// \brief 根据索引获取体的面
        /// \param index 索引
        /// \return 体的面
        virtual IGraphicsBRepFace* GetFaceFW(int index) = 0;

        /// \brief 根据索引获取体的边
        /// \param index 索引
        /// \return 体的边
        virtual const IGraphicsBRepEdge* GetEdge(int edgeIndex) const = 0;

        /// \brief 根据索引获取体的边
        /// \param index 索引
        /// \return 体的边
        virtual IGraphicsBRepEdge* GetEdgeFW(int edgeIndex) = 0;

        /// \brief 用目标体替换当前体
        /// \param other 目标体
        /// \return 无    
        virtual void ReplaceWith(OwnerPtr<IGraphicsBRepBody> other) = 0;

        /// \brief 判断是否是壳体
        /// \return true-是；false-不是
        virtual bool IsShell() const = 0;

        /// \brief 获取体的所有面
        /// \return 体的所有面
        /// \see IGraphicsNodeList
        virtual const IGraphicsNodeList* GetFaceNodes() const = 0;

        /// \brief 获取体的所有面
        /// \return 体的所有面
        /// \see IGraphicsNodeList
        virtual IGraphicsNodeList* GetFaceNodesFW() = 0;

        /// \brief 获取体的所有边
        /// \return 体的所有边
        /// \see IGraphicsNodeList
        virtual const IGraphicsNodeList* GetEdgeNodes() const = 0;

        /// \brief 获取体的所有边
        /// \return 体的所有边
        /// \see IGraphicsNodeList
        virtual IGraphicsNodeList* GetEdgeNodesFW() = 0;

        /// \brief 设置体的所有面
        /// \return 体的所有面
        /// \see IGraphicsNodeList
        virtual void SetFaceNodes(OwnerPtr<IGraphicsNodeList> pFaceNodes) = 0;

        /// \brief 设置体的所有边
        /// \return 体的所有边
        /// \see IGraphicsNodeList
        virtual void SetEdgeNodes(OwnerPtr<IGraphicsNodeList> pEdgeNodes) = 0;

        /// \brief 设置是否以体的方式离散（体个部分显示属性相同，设置该标签可提高性能）
        /// \return 默认false
        virtual void SetDiscretizingAsAWhole(bool discreteBody) = 0;

        /// \brief 是否以体的方式离散
        /// \return 默认返回false
        virtual bool IsDiscretizingAsAWhole()const = 0;

        /// \brief 获取距离离散精度
        /// \return 精度值
        virtual double GetDistanceDiscreteEpsilon() const = 0;

        /// \brief 设置距离离散精度
        /// \param epsilon 距离精度值 
        /// \return 精度值
        virtual void SetDistanceDiscreteEpsilon(double epsilon) = 0;

        /// \brief 获取角度离散精度
        /// \return 精度值
        virtual double GetAngleDiscreteEpsilon() const = 0;

        /// \brief 设置角度离散精度
        /// \param epsilon 角度精度值，角度离散精度，单位是弧度，如一个圆离散成 8 份应该写成 Constants::MATH_2PI / 8.0
        /// \return 精度值
        virtual void SetAngleDiscreteEpsilon(double epsilon) = 0;


        /// \brief 获取调试信息
        /// \return 调试信息
        virtual std::wstring GetStringForDebug()const = 0;

    public:
        /// \brief 创建默认的BRep体图形节点
        /// \return 创建的默认BRep体图形节点
        static OwnerPtr<IGraphicsBRepBody> Create();

        /// \brief 根据BRep体创建BRep体图形节点
        /// \param opBody BRep体
        /// \return 创建的BRep体图形节点
        static OwnerPtr<IGraphicsBRepBody> Create(OwnerPtr<IBody> opBody);

        /// \brief 根据BRep体创建BRep体图形节点
        /// \param body BRep体
        /// \param graphicsInfo graphics 信息
        /// \return 创建的BRep体图形节点
        static OwnerPtr<IGraphicsBRepBody> Create(OwnerPtr<IBody> body, const GcmpJsonWrapper& graphicsInfo);

        /// \brief 复制创建BRep体图形节点
        /// \param source 源BRep体图形节点
        /// \return 创建的BRep体图形节点
        static OwnerPtr<IGraphicsBRepBody> Create(const IGraphicsBRepBody* pSource);
    };
}

